package com.guang.executor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description
 *      1、创建线程有几种方式？
 *      2、区别是什么？callable和runnable的区别是什么？本质上还是在run方法中调用call方法；
 *      3、创建10W个线程，需要时间；利用Executors创建，时间较短；
 *      4、Executor接口的execute方法和ExecutorService中的submit的区别
 *             因为二者是继承关系，所以方法之间是有区别的
 *              一、方法返回值不同；
 *              二、方法参数不同。execute方法是Runnable，而submit是Callable方法
 *              三、
 *
 * @Author liguang
 * @Date 2022/10/23/23:11
 */
public class Test {

    private static final ExecutorService executor = new ThreadPoolExecutor(10, 10, 5, TimeUnit.SECONDS, new LinkedBlockingDeque<>(), new ThreadFactory() {
        private AtomicInteger atomicInteger = new AtomicInteger(1);
        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r,"self_"+atomicInteger.getAndIncrement());
        }
    },new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 所以总结出来多线程并不一定就比单线程快！因为单线程关注于使用某一点，而多线程关注的分治思想，分而治之
        //  makeuseofDutipleThread(); 61ms
    }

    private static void makeuseofDutipleThread() throws InterruptedException, ExecutionException {
        long startTime = System.currentTimeMillis();
        List<Integer> resultList = new ArrayList<>();
        List<Future<Integer>> futureList = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            int k = i;
            Future<Integer> result = executor.submit(() -> {
//                try {
//                    TimeUnit.SECONDS.sleep(2);
//                    return k;
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
                return k;
            });
            futureList.add(result);
        }
        for (Future<Integer> integerFuture : futureList) {
            Integer integer = integerFuture.get();
            resultList.add(integer);
        }
        int resultCount = 0;
        for (Integer integer : resultList) {
            resultCount+=integer;
        }

        System.out.println(String.format("最终获取得到的值是：%s，中间执行了%s ms",resultCount,System.currentTimeMillis()-startTime));
    }
}
